//
//  LoadInitializeTest.m
//  Charles
//
//  Created by Charles on 2019/6/15.
//  Copyright © 2019 charles. All rights reserved.
//

#import "LoadInitializeTest.h"

@implementation Pet
/*load 和 initialize 的调用顺序是 load在前，initialize在后。
 通过打印日志不能正确的看到这一点，通过断点的方式可以得出结论。
*/
+ (void)load {
    NSLog(@"%@_%s",[self class],__func__);
    // 即使调用了sleep方法，+initialize 方法依然会立即调用，这说明它不是在+load方法调用完成之后调用，而是在+load方法开始调用时就调用。
    //sleep(3);
}

+ (void)initialize {
    if (self == [Pet class]) {
        NSLog(@"%@_%s",[self class],__func__);
    }
}

- (void)speak {
    NSLog(@"%@ Speak！",[self class]);
}

@end

@implementation Cat

+ (void)load {
    NSLog(@"%@_%s",[self class],__func__);
}

+ (void)initialize {
    NSLog(@"%@_%s",[self class],__func__);
}

@end

@implementation Cat (Function)

+ (void)load {
    NSLog(@"%@_%s",[self class],__func__);
}

+ (void)initialize {
    NSLog(@"%@_%s",[self class],__func__);
}

@end

@implementation LoadInitializeTest

+ (void)loadInitializeTest {
    Cat *cat = [[Cat alloc]init];
    [cat speak];
}

@end
